/**
 * @file udpUtil.c
 * @brief Sorgente contenente le funzioni base per le comunicazini tramite protocollo UDP.
 *
 * Sono inserite le funzioni per la creazione del socket.
 *
 * @date Mar 26, 2012
 * @author Francesco Corvino
 */
#include "rscNet.h"
#include "../RscApp/rscApplication.h"
#include "../logproxy/logproxy.h"

#define LOG_NAME_UDPUTIL "udplog"

/**
 * @brief Restituisce un file descriptor per un socket che permette la
 * comunicazione tramite protocollo UDP.
 */
int UDP_getFdSocketFor(char *addr, char *port, AddressInfo * selectAdd){
	int sockfd;
	AddressInfo hints, *servinfo, *res;

	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_DGRAM;
	// richiede le informazioni sul tipo di socket da apripre per poter comunicare
	if ((getaddrinfo(addr, port, &hints, &servinfo)) != 0)  return -1;

	// loop through all the results and make a socket
	for(res = servinfo; res != NULL; res = res->ai_next) {
		if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1) {
			// inserire le operazioni di notifica dell'errore
			// di apertura del socket
			continue;
		}
		break;		// il socket è aperto è valido continuo le operazioni
	}
	if (res == NULL) {
		// nessun file descriptor è stato aperto
		return -1;
	}
	memcpy(selectAdd, res,sizeof(AddressInfo));
	return sockfd;
}

int UDP_sendMsgTo(int sockfd, AddressInfo * p, char *msg){
	char *msgtosend = msg;
	int numbytes, iPkt, restbytes = (int) strlen(msg);
	if(restbytes==0) return -1;
	int numpkt = (restbytes/UDP_MAX_SIZE_PKT) + 1;
	log_namedlevel(LOG_NAME_UDPUTIL, LOG_INFO_LEVEL,
			"Invio dei dati tramite socket UDP.. numero di paccetti = %d \n",numpkt);
	// controllo se la lunghezza dei byte da inviare supera la dimensione usuale dei pacchetti udp
	for(iPkt=0;iPkt<numpkt;iPkt++){
		if ((numbytes = sendto(sockfd, msgtosend, restbytes, 0,
				p->ai_addr, p->ai_addrlen)) == -1)  return -1;
		restbytes-= numbytes;
		msgtosend+= numbytes;
	}
	return numpkt;
}

void UDP_recvMsg(int sockfd, char *bufin, int maxBufin, Address * remote){
	int len = 0, n;
    /* read a datagram from the socket (put result in bufin) */
    n = recvfrom(sockfd, bufin, maxBufin, 0,remote, &len);

}
